package com.example.a053testthreaddemo;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

public class calculatePrime extends AppCompatActivity {
    Button btnRunnable;
    EditText editInput;
    public final static int UPDATE_NOW = 1; // 全局常量。定义一个常量，用于标识更新
    public final static String UPPER_NUM = "upper";
    public mHandler handler;
    public int input, temp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_calculate_prime);

        editInput = (EditText) findViewById(R.id.editInput);
        btnRunnable = (Button) findViewById(R.id.btnCal);

        handler = new mHandler();
        btnRunnable.setOnClickListener(new mClick());
    }

    // 利用Handler实现线程间通信
    // 利用Handler类处理计算“耗时长”的操作，不阻塞UI进程
    private class mHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            List<Integer> nums = new ArrayList<>();
            if (msg.what == UPDATE_NOW) {
                int upper = msg.getData().getInt(UPPER_NUM);
                // 计算从2开始到upper的所有质数
                outer:
                for (int i = 2; i <= upper; i++) {
                    // 用i除以2开始到i的平方根的所有数
                    int j = 2;
                    while (j <= Math.sqrt(i)) {
                        if (i != 2 && i % j == 0) {
                            continue outer;
                        }
                        j++;
                    }
                    nums.add(i);
                }
                // 使用Toast显示统计出来的质数
                Toast.makeText(calculatePrime.this, nums.toString(), Toast.LENGTH_LONG).show();
            }
        }
    }

    class mClick implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            // 以下5行是异常处理，保证输入大于等于2的整数，否则抛出异常
            if (TextUtils.isEmpty(editInput.getText())) {
                input = 0;
            } else {
                try {
                    input = Integer.parseInt(editInput.getText().toString());
                    temp = 2 / input;
                } catch (Exception e) {
                    Toast.makeText(calculatePrime.this, "请输入大于2的整数！", Toast.LENGTH_LONG).show();
                    return;
                }
            }
            // runnable匿名内部类，启动一个新的子线程，并把子线程的Looper对象传给Handler
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Message msg = new Message();
                    msg.what = UPDATE_NOW;
                    Bundle bundle = new Bundle();
                    bundle.putInt(UPPER_NUM, input);
                    msg.setData(bundle);
                    // 一个线程只能由一个Looper，所以，不能放在Handler类
                    android.os.Looper.prepare();
                    // Todo，重复发送的消息或完成的动作等
                    handler.sendMessage(msg);
                    android.os.Looper.loop();
                }
            }).start();
        }
    }
}